Some modern computer programs are adapted to execute on heterogeneous computing platforms (platforms) that include a host processor and one or more devices. The host processor is often a central processing unit (CPU) while the devices may be graphics processing unit(s) (GPUs), digital signal processor(s) (DSPs), programmable integrated circuits (ICs), and so forth. Such computer programs typically include a portion that executes on the host processor and one or more other portions, called kernels, that are implemented on the devices.
In some cases, kernels are compiled into executable program code for execution by devices such as DSPs, GPUs, and so forth. In other cases, kernels are hardware accelerated by being compiled into circuitry. The kernel circuit is implemented within an IC. The kernel circuit is functionally equivalent to an executable version of the kernel. A circuit design specifying the kernel circuit is loaded into a programmable IC, for example, thereby implementing the kernel circuitry in hardware.
Often, kernel designers are software developers or have software development backgrounds. The kernels are coded using a high level programming language (HLL). In the software development realm, one expects compilation of HLL source code into executable program code to succeed presuming correct syntax. Such is the case despite any inefficiencies in the kernel design itself. By comparison, compilation of HLL source code into a circuit design may fail for any number of different reasons that may be unrelated to whether the HLL source code is syntactically correct. The inability to meet a timing constraint is one example of a hardware compiler failing to successfully compile a kernel. Unfortunately, many software developers are unfamiliar with the types of errors generated by hardware compilers and unable to address such errors.